/*
  AB CD 01 M0 M1 M2 M3 FZ 00 XX   //10字节
  AB CD为头码
  XX 为校验码 = 01+M0 + M1 + M2 +M3+00+FZ + 01，不包含头码
  M0 M1 M2 M3为四个电机速度控制
  若Mx<128为正向的速度；若Mx>128,则反向的速度=255-Mx+1
  FZ：分组号，1，2，4，8对应接收的分组开关，0为控制全部AB CD 01 M0 M1 M2 M3 FZ 00 XX   //10字节
  AB CD为头码
  XX 为校验码 = 01+M0 + M1 + M2 +M3+00+FZ + 01，不包含头码
  M0 M1 M2 M3为四个电机速度控制
  若Mx<128为正向的速度；若Mx>128,则反向的速度=255-Mx+1
  FZ：分组号，1，2，4，8对应接收的分组开关，0为控制全部
 */
class CommandData {
  final List<int> _data = [
    0xAB,
    0xCD,
    0x01,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00
  ];

  CommandData();

  /*
   * 校验码计算方法 
    // _data[9] = 0x01 +
    //     _data[3] +
    //     _data[4] +
    //     _data[5] +
    //     _data[6] +
    //     _data[7] +
    //     _data[8] +
    //     01;
   */
  checksum() {
    int sum = 0x01;
    for (int i = 3; i < 9; i++) {
      sum += _data[i];
    }
    sum += 0x01;
    _data[9] = sum;
  }

  /*
   * 命令结果
   */
  List<int> get data {
    checksum();
    return _data;
  }

  /*
   * 设置方向命令
   * vertical -1 ~ 1,
   * horizontal -1 ~ 1,
   */
  List<int> setAction(
      {
      // double? forward,
      // double? backward,
      // double? left,
      // double? right,
      double? vertical,
      double? horizontal,
      int index = 0}) {
    if (vertical != null) {
      int val = (vertical * 127.0).toInt() & 0xFF;
      _data[3] = val;
    }
    if (horizontal != null) {
      int val = (horizontal * 127.0).toInt() & 0xFF;
      _data[4] = val;
    }
    return data;
  }
}
